'use strict'
/**
成员管理
*/
let urljoin = require("url-join"),
	_ = require("lodash"),
	template = require("es6-template-strings"),
	log4js = require('log4js'),
	logger = log4js.getLogger('qywx-api'),
	debug = require('debug')('qywx-api'),
	rp = require("request-promise"),
	URLs = require('./urls.js').URLs();

module.exports = function() {
	return {

		/**
			获取部门成员详情
			params{
	 		参数	必须	说明
	 		access_token	是	调用接口凭证
	 		department_id	是	获取的部门id
	 		fetch_child	否	1/0：是否递归获取子部门下面的成员
	 		status	否	0获取全部成员，1获取已关注成员列表，2获取禁用成员列表，4获取未关注成员列表。status可叠加，未填写则默认为4
	 	 * }
		*/
		getMemberListDetail: function(accessToken, department_id, fetch_child, status, cb) {
			let targetUrl =
				template(URLs.CONTACTS_MEMBER_LISTDETAIL, {
					accessToken: accessToken
				});
			debug("获取部门成员详情列表:", targetUrl);
			let requestData = {
				accessToken: accessToken,
				department_id: department_id,
				fetch_child: fetch_child || 1,
				status: status || 4
			};
			var rpOptions = {
				uri: targetUrl,
				method: "GET",
				body: requestData,
				json: true
			};
			/**
			 * 返回结果
			 * {
					 "errcode": 0,
					 "errmsg": "ok",
					 "userlist": [
									 {
													"userid": "zhangsan",
													"name": "李四",
													"department": [1, 2]
									 }
						 ]
				}
			 */
			rp(rpOptions).then(function(data) {
					if (data.errcode > 0) {
						logger.error("request error: ", data);
						return cb(new Error(data.errmsg));
					}
					return cb(null, data);
				})
				.catch(function(err) {
					logger.error("request error: ", err);
					return cb(err);
				});

		},
		/**	FIXME:微信返回成功，凡是并未获得数据
	 * 获取部门成员列表
	 * params{
		参数	必须	说明
		access_token	是	调用接口凭证
		department_id	是	获取的部门id
		fetch_child	否	1/0：是否递归获取子部门下面的成员
		status	否	0获取全部成员，1获取已关注成员列表，2获取禁用成员列表，4获取未关注成员列表。status可叠加，未填写则默认为4
	 * }
	 */
		getSimpleListMember: function(accessToken, department_id, fetch_child, status, cb) {
				let targetUrl =
					template(URLs.CONTACTS_MEMBER_SIMPLELIST, {
						accessToken: accessToken
					});
				debug("获取部门成员列表:", targetUrl);
				let requestData = {
					accessToken: accessToken,
					department_id: department_id,
					fetch_child: fetch_child || 1,
					status: status || 4
				};
				var rpOptions = {
					uri: targetUrl,
					method: "GET",
					body: requestData,
					json: true
				};
				/**
				 * 返回结果
				 * {
					   "errcode": 0,
					   "errmsg": "ok",
					   "userlist": [
					           {
					                  "userid": "zhangsan",
					                  "name": "李四",
					                  "department": [1, 2]
					           }
					     ]
					}
				 */
				rp(rpOptions).then(function(data) {
						if (data.errcode > 0) {
							logger.error("request error: ", data);
							return cb(new Error(data.errmsg));
						}
						return cb(null, data);
					})
					.catch(function(err) {
						logger.error("request error: ", err);
						return cb(err);
					});

			}
			/**
			 * 批量删除成员
				参数	必须	说明
				access_token	是	调用接口凭证
				useridlist	是	成员UserID列表。对应管理端的帐号
			 */
			,
		batchdeleteMember: function(accessToken, useridlist, cb) {
				let targetUrl =
					template(URLs.CONTACTS_MEMBER_BATCHDELETEDELETE, {
						accessToken: accessToken
					});
				debug("批量删除成员:", targetUrl);
				let requestData = {
					useridlist: useridlist
				};
				var rpOptions = {
					uri: targetUrl,
					method: "POST",
					body: requestData,
					headers: {
						'User-Agent': 'Request-Promise'
					},
					json: true
				};
				/**
				 * 返回结果
				 * {
					   "errcode": 0,
					   "errmsg": "deleted"
					}
				 */
				rp(rpOptions).then(function(data) {
						if (data.errcode > 0) {
							logger.error("request error: ", data);
							return cb(new Error(data.errmsg));
						}
						return cb(null, data);
					})
					.catch(function(err) {
						logger.error("request error: ", err);
						return cb(err);
					});

			}
			/**
			 * 删除成员
			 * 参数	必须	说明
				access_token	是	调用接口凭证
				userid	是	成员UserID。对应管理端的帐号
			 */
			,
		deleteMember: function(accessToken, userid, cb) {
				let targetUrl =
					template(URLs.CONTACTS_MEMBER_DELETE, {
						accessToken: accessToken
					});
				debug("删除成员:", targetUrl);
				let requestData = {
					userid: userid
				};
				var rpOptions = {
					uri: targetUrl,
					method: "GET",
					qs: requestData,
					headers: {
						'User-Agent': 'Request-Promise'
					},
					json: true
				};
				/**
				 * 返回结果
					{
					   "errcode": 0,
					   "errmsg": "deleted"
					}
				 */
				rp(rpOptions).then(function(data) {
						if (data.errcode > 0) {
							logger.error("request error: ", data);
							return cb(new Error(data.errmsg));
						}
						return cb(null, data);
					})
					.catch(function(err) {
						logger.error("request error: ", err);
						return cb(err);
					});

			}
			/**
			 * 更新成员
			 ** Params{
				参数	      必须	      说明
				access_token	是	调用接口凭证
				userid	是	成员UserID。对应管理端的帐号，企业内必须唯一。长度为1~64个字节
				name	否	成员名称。长度为0~64个字节
				department	否	成员所属部门id列表
				position	否	职位信息。长度为0~64个字节
				mobile	否	手机号码。企业内必须唯一，mobile/weixinid/email三者不能同时为空
				gender	否	性别。1表示男性，2表示女性
				email	否	邮箱。长度为0~64个字节。企业内必须唯一
				weixinid	否	微信号。企业内必须唯一。（注意：是微信号，不是微信的名字）
				enable	否	启用/禁用成员。1表示启用成员，0表示禁用成员
				avatar_mediaid	否	成员头像的mediaid，通过多媒体接口上传图片获得的mediaid
				extattr	否	扩展属性。扩展属性需要在WEB管理端创建后才生效，否则忽略未知属性的赋值
			 * }
			 */
			,
		updateMember: function(accessToken, userid, name, department, position, mobile, gender, email, weixinid, avatar_mediaid, extattr, cb) {
				let targetUrl =
					template(URLs.CONTACTS_MEMBER_UPDATE, {
						accessToken: accessToken
					});
				debug("更新成员:", targetUrl);
				let requestData = {
					userid: userid,
					name: name,
					department: department || 1,
					position: position,
					mobile: mobile,
					gender: gender,
					email: email,
					weixinid: weixinid,
					avatar_mediaid: avatar_mediaid,
					extattr: extattr,
				};

				var rpOptions = {
					method: 'POST',
					uri: targetUrl,
					body: requestData,
					json: true // Automatically stringifies the body to JSON
				};
				/**
				 * 返回结果
				 * {
					   "errcode": 0,
					   "errmsg": "updated"
					}
				 */
				rp(rpOptions).then(function(data) {
						if (data.errcode > 0) {
							logger.error("request error: ", data);
							return cb(new Error(data.errmsg));
						}
						return cb(null, data);
					})
					.catch(function(err) {
						logger.error("request error: ", err);
						return cb(err);
					});



			}
			/**
		 * 创建成员
		 * Params{
			参数	      必须	      说明
			access_token	是	调用接口凭证
			userid	是	成员UserID。对应管理端的帐号，企业内必须唯一。长度为1~64个字节
			name	是	成员名称。长度为1~64个字节
			department	否	成员所属成员id列表
			position	否	职位信息。长度为0~64个字节
			mobile	否	手机号码。企业内必须唯一，mobile/weixinid/email三者不能同时为空
			gender	否	性别。1表示男性，2表示女性
			email	否	邮箱。长度为0~64个字节。企业内必须唯一
			weixinid	否	微信号。企业内必须唯一。（注意：是微信号，不是微信的名字）
			avatar_mediaid	否	成员头像的mediaid，通过多媒体接口上传图片获得的mediaid
			extattr	否	扩展属性。扩展属性需要在WEB管理端创建后才生效，否则忽略未知属性的赋值
		 * }
		 */
			,
		createMember: function(accessToken, userid, name, department, position, mobile, gender, email, weixinid, avatar_mediaid, extattr, cb) {

				let targetUrl =
					template(URLs.CONTACTS_MEMBER_CREATE, {
						accessToken: accessToken
					});
				debug("创建成员:", targetUrl);
				let requestData = {
					userid: userid,
					name: name,
					department: department || 1,
					position: position,
					mobile: mobile,
					gender: gender,
					email: email,
					weixinid: weixinid,
					avatar_mediaid: avatar_mediaid,
					extattr: extattr,
				};

				var rpOptions = {
					uri: targetUrl,
					method: "POST",
					json: true,
					body: requestData
				};
				/**
            {
        "errcode": 0,
        "errmsg": "created"
      }
			 */
				rp(rpOptions).then(function(data) {
						if (data.errcode > 0) {
							logger.error("request error: ", data);
							return cb(new Error(data.errmsg));
						}
						return cb(null, data);
					})
					.catch(function(err) {
						logger.error("request error: ", err);
						return cb(err);
					});



			}
			/**
			 * 获取成员
			 * params{
			 * 	参数	必须	说明
				access_token	是	调用接口凭证
				userid	是	成员UserID。对应管理端的帐号
			 * }
			 */
			,
		getMember: function(accessToken, userid, cb) {
			let targetUrl =
				template(URLs.CONTACTS_MEMBER_GET, {
					accessToken: accessToken
				});
			debug("获取成员:", targetUrl);
			let requestData = {
				userid: userid
			};
			var rpOptions = {
				uri: targetUrl,
				method: "GET",
				qs: requestData,
				headers: {
					'User-Agent': 'Request-Promise'
				},
				json: true
			};
			/**返回结果
			        {
			   "errcode": 0,
			   "errmsg": "ok",
			   "userid": "zhangsan",
			   "name": "李四",
			   "department": [1, 2],
			   "position": "后台工程师",
			   "mobile": "15913215421",
			   "gender": "1",
			   "email": "zhangsan@gzdev.com",
			   "weixinid": "lisifordev",
			   "avatar": "http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/0",
			   "status": 1,
			   "extattr": {"attrs":[{"name":"爱好","value":"旅游"},{"name":"卡号","value":"1234567234"}]}
			}
			 */
			rp(rpOptions).then(function(data) {
					if (data.errcode > 0) {
						logger.error("request error: ", data);
						return cb(new Error(data.errmsg));
					}
					return cb(null, data);
				})
				.catch(function(err) {
					logger.error("request error: ", err);
					return cb(err);
				});

		}

	}

}